home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / system / mail / transpor / ifmail23.z / ifmail23 / ifmail / iflib / rdconfig.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-09  |  16.2 KB  |  721 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <time.h>
  8. #include "xutil.h"
  9. #include "lutil.h"
  10. #include "ftn.h"
  11. #include "config.h"
  12.  
  13. #ifndef PUBDIR
  14. #define PUBDIR "/usr/spool/uucppublic"
  15. #endif
  16.  
  17. #ifndef CONFIGFILE
  18. #define CONFIGFILE "config"
  19. #endif
  20.  
  21. #ifndef LOGFILE
  22. #define LOGFILE "iflog"
  23. #endif
  24.  
  25. #ifndef DEBUGFILE
  26. #define DEBUGFILE NULL
  27. #endif
  28.  
  29. #ifndef BUFSIZ
  30. #define BUFSIZ 512
  31. #endif
  32.  
  33.             /* Global configuration variables */
  34.  
  35. char *configname=CONFIGFILE;
  36. char *nlbase=NULL;
  37.  
  38. dom_trans *domtrans=NULL;
  39.  
  40. fa_list *whoami=NULL;
  41. fa_list *pwlist=NULL;
  42. fa_list *nllist=NULL;
  43.  
  44. modem_string *modemport=NULL;
  45. modem_string *phonetrans=NULL;
  46. modem_string *modemreset=NULL;
  47. modem_string *modemdial=NULL;
  48. modem_string *modemhangup=NULL;
  49. modem_string *modemok=NULL;
  50. modem_string *modemconnect=NULL;
  51. modem_string *modemerror=NULL;
  52. modem_string *options=NULL;
  53.  
  54. area_list *badgroups=NULL;
  55.  
  56. long maxfsize=65536L;
  57. long speed=0L;
  58.  
  59. char intab[] = {
  60. "\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017"
  61. "\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
  62. "\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057"
  63. "\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077"
  64. "\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117"
  65. "\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137"
  66. "\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157"
  67. "\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177"
  68. "\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217"
  69. "\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237"
  70. "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257"
  71. "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277"
  72. "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317"
  73. "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337"
  74. "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357"
  75. "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377"
  76. };
  77.  
  78. char outtab[] = {
  79. "\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017"
  80. "\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
  81. "\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057"
  82. "\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077"
  83. "\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117"
  84. "\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137"
  85. "\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157"
  86. "\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177"
  87. "\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217"
  88. "\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237"
  89. "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257"
  90. "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277"
  91. "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317"
  92. "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337"
  93. "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357"
  94. "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377"
  95. };
  96.  
  97. char *name="Unknown";
  98. char *location="Somewhere";
  99. char *sysop="Sysop";
  100. char *phone="-Unpublished-";
  101. char *flags="";
  102. char *inbound="/tmp";
  103. char *norminbound=NULL;
  104. char *listinbound=NULL;
  105. char *protinbound=NULL;
  106. char *outbound=NULL;
  107. char *database=NULL;
  108. char *aliasfile=NULL;
  109. char *myfqdn=NULL;
  110. char *sequence=NULL;
  111. char *sendmail=NULL;
  112. char *rnews=NULL;
  113. char *iftoss=NULL;
  114. char *packer=NULL;
  115. char *unzip=NULL;
  116. char *unarj=NULL;
  117. char *unlzh=NULL;
  118. char *unarc=NULL;
  119. char *unzoo=NULL;
  120. char *areafile=NULL;
  121. char *newslog=NULL;
  122. char *msgidbm=NULL;
  123. char *public=PUBDIR;
  124. char *magic=NULL;
  125. char *debugfile=NULL;
  126. char *routefile=NULL;
  127. time_t configtime=0L;
  128.  
  129.             /* Local */
  130.  
  131. static int verbset=0;
  132. static char *k,*v;
  133. static int linecnt=0;
  134. static int level=0;
  135. static dom_trans defdomtrans = {NULL,"fidonet","fidonet.org"};
  136.  
  137.             /* External variables */
  138.  
  139. extern char *myname;
  140. extern char *version;
  141. extern char *reldate;
  142. extern char *copyright;
  143. extern char *logname;
  144. extern char *errname;
  145. extern unsigned long verbose;
  146. extern unsigned long setverbose(char*);
  147. extern void usage(void);
  148.  
  149.             /* parser prototypes */
  150.  
  151. static int getincl(char**);
  152. static int getstr(char**);
  153. static int getaddr(char**);
  154. static int getadnl(char**);
  155. static int getadpw(char**);
  156. static int getarea(char**);
  157. static int getmstr(char**);
  158. static int getdtrn(char**);
  159. static int getlong(char**);
  160. static int getctab(char**);
  161. static int getverbose(char**);
  162.  
  163.             /* keyword table */
  164.  
  165. static struct _keytab {
  166.     char *key;
  167.     int (*prc)(char**);
  168.     char** dest;
  169. } keytab[] = {
  170.     {"include",    getincl,    NULL},
  171.  
  172.     {"address",    getaddr,    (char**)&whoami},
  173.     {"password",    getadpw,    (char**)&pwlist},
  174.     {"nodelist",    getadnl,    (char**)&nllist},
  175.  
  176.     {"domtrans",    getdtrn,    (char**)&domtrans},
  177.  
  178.     {"modemport",    getmstr,    (char**)&modemport},
  179.     {"phonetrans",    getmstr,    (char**)&phonetrans},
  180.     {"modemreset",    getmstr,    (char**)&modemreset},
  181.     {"modemdial",    getmstr,    (char**)&modemdial},
  182.     {"modemhangup",    getmstr,    (char**)&modemhangup},
  183.     {"modemok",    getmstr,    (char**)&modemok},
  184.     {"modemconnect",getmstr,    (char**)&modemconnect},
  185.     {"modemerror",    getmstr,    (char**)&modemerror},
  186.     {"options",    getmstr,    (char**)&options},
  187.  
  188.     {"badgroup",    getarea,    (char**)&badgroups},
  189.  
  190.     {"verbose",    getverbose,    (char**)&verbose},
  191.     {"maxfsize",    getlong,    (char**)&maxfsize},
  192.     {"speed",    getlong,    (char**)&speed},
  193.  
  194.     {"intab",    getctab,    (char**)&intab},
  195.     {"outtab",    getctab,    (char**)&outtab},
  196.  
  197.     {"name",    getstr,        &name},
  198.     {"location",    getstr,        &location},
  199.     {"sysop",    getstr,        &sysop},
  200.     {"phone",    getstr,        &phone},
  201.     {"flags",    getstr,        &flags},
  202.     {"inbound",    getstr,        &norminbound},
  203.     {"protinbound",    getstr,        &protinbound},
  204.     {"listinbound",    getstr,        &listinbound},
  205.     {"outbound",    getstr,        &outbound},
  206.     {"database",    getstr,        &database},
  207.     {"sysalias",    getstr,        &aliasfile},
  208.     {"myfqdn",    getstr,        &myfqdn},
  209.     {"sequencer",    getstr,        &sequence},
  210.     {"sendmail",    getstr,        &sendmail},
  211.     {"rnews",    getstr,        &rnews},
  212.     {"iftoss",    getstr,        &iftoss},
  213.     {"packer",    getstr,        &packer},
  214.     {"unzip",    getstr,        &unzip},
  215.     {"unarj",    getstr,        &unarj},
  216.     {"unlzh",    getstr,        &unlzh},
  217.     {"unarc",    getstr,        &unarc},
  218.     {"unzoo",    getstr,        &unzoo},
  219.     {"areas",    getstr,        &areafile},
  220.     {"newslog",    getstr,        &newslog},
  221.     {"msgidbm",    getstr,        &msgidbm},
  222.     {"public",    getstr,        &public},
  223.     {"magic",    getstr,        &magic},
  224.     {"logfile",    getstr,        &logname},
  225.     {"errfile",    getstr,        &errname},
  226.     {"debugfile",    getstr,        &debugfile},
  227.     {"routefile",    getstr,        &routefile},
  228.     {NULL,        NULL,        NULL}
  229. };
  230.  
  231.             /* public entry point */
  232. int readconfig(void);
  233. int readconfig(void)
  234. {
  235.     int maxrc=0,rc,i;
  236.     FILE *fp;
  237.     char buf[BUFSIZ],*p;
  238.     struct stat st;
  239.  
  240.     if (stat(configname,&st) != 0)
  241.     {
  242.         fprintf(stderr,"readconfig: cannot stat file \"%s\"",
  243.             configname);
  244.         perror("");
  245.         return 1;
  246.     }
  247.     if (st.st_mtime > configtime) configtime=st.st_mtime;
  248.     if ((fp=fopen(configname,"r")) == NULL)
  249.     {
  250.         fprintf(stderr,"readconfig: cannot open file \"%s\"",
  251.             configname);
  252.         perror("");
  253.         return 1;
  254.     }
  255.     if (level == 0)
  256.     {
  257.         logname=LOGFILE;
  258.         errname=LOGFILE;
  259.         debugfile=DEBUGFILE;
  260.     }
  261.     while (fgets(buf,sizeof(buf)-1,fp))
  262.     {
  263.         linecnt++;
  264.         if (*(p=buf+strlen(buf)-1) != '\n')
  265.         {
  266.             fprintf(stderr,"%s(%d): %s - line too long\n",
  267.                 configname,linecnt,buf);
  268.             while (fgets(buf,sizeof(buf)-1,fp) &&
  269.                 (*(p=buf+strlen(buf)-1) != '\n'));
  270.             continue;
  271.         }
  272.  
  273.         *p--='\0';
  274.         while ((p >= buf) && isspace(*p)) *p--='\0';
  275.         k=buf;
  276.         while (*k && isspace(*k)) k++;
  277.         p=k;
  278.         while (*p && !isspace(*p)) p++;
  279.         *p++='\0';
  280.         v=p;
  281.         while (*v && isspace(*v)) v++;
  282.  
  283.         if ((*k == '\0') || (*k == '#'))
  284.         {
  285.             if (verbose & (1<<15))
  286.                 fprintf(stderr,"%s(%d): \"%s\" \"%s\" - ignore\n",
  287.                     configname,linecnt,k,v);
  288.             continue;
  289.         }
  290.  
  291.         if (verbose & (1<<15))
  292.             fprintf(stderr,"%s(%d): \"%s\" \"%s\" - parsed\n",
  293.                 configname,linecnt,k,v);
  294.  
  295.         for (i=0;keytab[i].key;i++)
  296.             if (strcasecmp(k,keytab[i].key) == 0) break;
  297.         if (keytab[i].key == NULL)
  298.         {
  299.             fprintf(stderr,"%s(%d): %s %s - unknown keyword\n",
  300.                 configname,linecnt,k,v);
  301.         }
  302.         else if ((rc=keytab[i].prc(keytab[i].dest)) > maxrc) maxrc=rc;
  303.     }
  304.     fclose(fp);
  305.  
  306.     if (level == 0)
  307.     {
  308.         if (whoami == NULL)
  309.         {
  310.             fprintf(stderr,"%s(EOF): address not specified\n",
  311.                     configname);
  312.             if (maxrc < 1) maxrc=1;
  313.         }
  314. #if 0
  315.         else if (whoami->addr->domain == NULL)
  316.         {
  317.             whoami->addr->domain=xstrcpy("fidonet");
  318.         }
  319. #endif
  320.  
  321.         if (outbound == NULL)
  322.         {
  323.         fprintf(stderr,"%s(EOF): outbound not specified\n",
  324.                 configname);
  325.             if (maxrc < 1) maxrc=1;
  326.         }
  327.  
  328.         if (nllist && whoami && (nllist->addr->domain == NULL))
  329.             nllist->addr->domain=whoami->addr->domain;
  330.     
  331.         if (norminbound) inbound=norminbound;
  332.         if (protinbound == NULL) protinbound=inbound;
  333.         if (listinbound == NULL) listinbound=inbound;
  334.         if (errname == NULL) errname=logname;
  335.  
  336.         if (domtrans == NULL) domtrans=&defdomtrans;
  337.  
  338.         if (verbose & (1<<15))
  339.         {
  340.             fprintf(stderr,"globals set in rdconfig:\n");
  341.             fprintf(stderr,"verbose:    %lu\n",verbose);
  342.             fprintf(stderr,"logname:    %s\n",logname);
  343.             fprintf(stderr,"errname:    %s\n",errname);
  344.             fprintf(stderr,"debugfile:  %s\n",debugfile);
  345.             fprintf(stderr,"configname: %s\n",configname);
  346.             fprintf(stderr,"configtime: %s",ctime(&configtime));
  347.         }
  348.  
  349.         if (debugfile) freopen(debugfile,"a",stderr);
  350.         debug(0,"start %s ver %s of %s, verbose 0x%08lx",
  351.             myname,version,reldate,verbose);
  352.     }
  353.  
  354.     return maxrc;
  355. }
  356.  
  357.     /* check option + optarg for being config option */
  358.  
  359. int confopt(c,arg)
  360. int c;
  361. char *arg;
  362. {
  363.     switch (c)
  364.     {
  365.  
  366.     case 'h':    usage();
  367.             exit(0);
  368.  
  369.     case 'x':    verbset=1;
  370.             verbose=setverbose(arg);
  371.             break;
  372.  
  373.     case 'I':    configname=arg;
  374.             break;
  375.  
  376.     default:    return 1; /* unrecognized option */
  377.  
  378.     }
  379.     return 0; /* recognized option */
  380. }
  381.  
  382. void confusage(extra)
  383. char *extra;
  384. {
  385.     fprintf(stderr,"%s ver. %s of %s; (c) %s\n",
  386.         myname,version,reldate,copyright);
  387.     fprintf(stderr,"    This is free software. You can do what you wish \
  388. with it\n    as long as this copyright notice is preserved.\n\n");
  389.     fprintf(stderr,"usage: %s -h -x<N> -I<file> %s\n",myname,extra);
  390.     fprintf(stderr,"-h        get this help\n");
  391.     fprintf(stderr,"-x<arg>        set debug level <arg>    [%08lx]\n",
  392.         verbose);
  393.     fprintf(stderr,"\t\t<arg> may be a number from 0 to 32 to set `on'\n");
  394.     fprintf(stderr,"\t\tbits from 1 to number, or a string of letters\n");
  395.     fprintf(stderr,"\t\t('a' - bit 1, 'b' - bit 2, e.t.c. up to bit 26)\n");
  396.     fprintf(stderr,"-I<file>     use config file    <file>    [%s]\n",
  397.         configname);
  398. }
  399.  
  400.             /* parsers */
  401.  
  402. static int getincl(dest)
  403. char **dest;
  404. {
  405.     int rc=0;
  406.     char *saveconfigname=configname;
  407.     int savelinecnt=linecnt;
  408.  
  409.     if (verbose & (1<<15)) fprintf(stderr,"getincl: %s(%d): %s %s\n",
  410.         configname,linecnt,k,v);
  411.  
  412.     configname=v;
  413.     linecnt=0;
  414.     level++;
  415.  
  416.     rc=readconfig();
  417.  
  418.     level--;
  419.     configname=saveconfigname;
  420.     linecnt=savelinecnt;
  421.     return rc;
  422. }
  423.  
  424. static int getstr(dest)
  425. char **dest;
  426. {
  427.     if (verbose & (1<<15)) fprintf(stderr,"getstr: %s(%d): %s %s\n",
  428.         configname,linecnt,k,v);
  429.     *dest=xstrcpy(v);
  430.     return 0;
  431. }
  432.  
  433. static int addalist(fa_list**,char*,char*);
  434. static int addalist(lst,addr,nm)
  435. fa_list **lst;
  436. char *addr,*nm;
  437. {
  438.     faddr *tmp;
  439.     fa_list **tmpl;
  440.  
  441.     if (verbose & (1<<15)) fprintf(stderr,"addalist: %s(%d): %s %s\n",
  442.         configname,linecnt,addr,nm);
  443.     if (nm && (*nm == '\0'))
  444.     {
  445.         fprintf(stderr,"%s(%d): no value for address %s\n",
  446.             configname,linecnt,addr);
  447.         return 0;
  448.     }
  449.     if (addr)
  450.     {
  451.         if ((tmp=parsefnode(addr)) == NULL)
  452.         {
  453.             fprintf(stderr,"%s(%d): unparsable address %s\n",
  454.                 configname,linecnt,addr);
  455.             return 0;
  456.         }
  457.     }
  458.     else
  459.     {
  460.         tmp=(faddr*)xmalloc(sizeof(faddr));
  461.         memset(tmp,0,sizeof(faddr));
  462.     }
  463.  
  464.     for (tmpl=lst;*tmpl;tmpl=&((*tmpl)->next));
  465.     *tmpl=(fa_list*)xmalloc(sizeof(fa_list));
  466.     (*tmpl)->next=NULL;
  467.     (*tmpl)->addr=tmp;
  468.     (*tmpl)->addr->name=xstrcpy(nm);
  469.     return 0;
  470. }
  471.  
  472. static int getaddr(dest)
  473. char **dest;
  474. {
  475.     if (verbose & (1<<15)) fprintf(stderr,"getaddr: %s(%d): %s %s\n",
  476.         configname,linecnt,k,v);
  477.     return addalist((fa_list**)dest,v,NULL);
  478. }
  479.  
  480. static int getadnl(dest)
  481. char **dest;
  482. {
  483.     char *p,*q,*tmp;
  484.     int rc;
  485.  
  486.     if (verbose & (1<<15)) fprintf(stderr,"getadnl: %s(%d): %s %s\n",
  487.         configname,linecnt,k,v);
  488.     p=v;
  489.     while (*p && !isspace(*p)) p++;
  490.     if (*p == '\0') p=NULL;
  491.     else
  492.     {
  493.         *p++='\0';
  494.         while (*p && isspace(*p)) p++;
  495.     }
  496.     if (nlbase == NULL)
  497.     {
  498.         nlbase=xstrcpy(v);
  499.         if (*nlbase != '/') nlbase[0]='\0';
  500.         if ((q=strrchr(nlbase,'/'))) *++q='\0';
  501.         if ((q=strrchr(v+1,'/'))) q++;
  502.         else q=v;
  503.     }
  504.     else q=v;
  505.  
  506.     tmp=xstrcpy(nlbase);
  507.     tmp=xstrcat(tmp,q);
  508.  
  509.     rc=addalist((fa_list**)dest,p,tmp);
  510.     free(tmp);
  511.     return rc;
  512. }
  513.  
  514. static int getadpw(dest)
  515. char **dest;
  516. {
  517.     char *p;
  518.  
  519.     if (verbose & (1<<15)) fprintf(stderr,"getadpw: %s(%d): %s %s\n",
  520.         configname,linecnt,k,v);
  521.     p=v;
  522.     while (*p && !isspace(*p)) p++;
  523.     if (*p == '\0')
  524.     {
  525.         fprintf(stderr,"%s(%d): no password for address %s\n",
  526.             configname,linecnt,v);
  527.         return 0;
  528.     }
  529.     *p++='\0';
  530.     while (*p && isspace(*p)) p++;
  531.     return addalist((fa_list**)dest,v,p);
  532. }
  533.  
  534. static int getarea(dest)
  535. char **dest;
  536. {
  537.     area_list **tmpl;
  538.  
  539.     if (verbose & (1<<15)) fprintf(stderr,"getarea: %s(%d): %s %s\n",
  540.         configname,linecnt,k,v);
  541.     for (tmpl=(area_list**)dest;*tmpl;tmpl=&((*tmpl)->next));
  542.     *tmpl=(area_list*)xmalloc(sizeof(area_list));
  543.     (*tmpl)->next=NULL;
  544.     (*tmpl)->name=xstrcpy(v);
  545.     return 0;
  546. }
  547.  
  548. static int getmstr(dest)
  549. char **dest;
  550. {
  551.     modem_string **tmpm;
  552.     int dep=0;
  553.     char *p,*q;
  554.  
  555.     if (verbose & (1<<15)) fprintf(stderr,"getmstr: %s(%d): %s %s\n",
  556.         configname,linecnt,k,v);
  557.     if (*v == '(')
  558.     {
  559.         p=v+1;
  560.         q=v;
  561.         do
  562.         {
  563.             if (*q == '(') dep++;
  564.             if (*q == ')') dep--;
  565.         }
  566.         while (dep && *q++);
  567.         if (*q == '\0')
  568.         {
  569.             fprintf(stderr,"%s(%d): %s - unbalanced brackets\n",
  570.                 configname,linecnt,v);
  571.             return 0;
  572.         }
  573.         *q++='\0';
  574.         while (*q && isspace(*q)) q++;
  575.         if (*q == '\0')
  576.         {
  577.             fprintf(stderr,"%s(%d): %s - no value for expression\n",
  578.                 configname,linecnt,p);
  579.             return 0;
  580.         }
  581.     }
  582.     else
  583.     {
  584.         p=NULL;
  585.         q=v;
  586.     }
  587.  
  588.     for (tmpm=(modem_string**)dest;*tmpm;tmpm=&((*tmpm)->next));
  589.     (*tmpm)=(modem_string *)
  590.         xmalloc(sizeof(modem_string));
  591.     (*tmpm)->next=NULL;
  592.     (*tmpm)->expr=xstrcpy(p);
  593.     (*tmpm)->line=xstrcpy(q);
  594.     if (verbose & (1<<15)) fprintf(stderr,"getmstr: %s(%d): expr \"%s\" line \"%s\"\n",
  595.         configname,linecnt,p,q);
  596.  
  597.     return 0;
  598. }
  599.  
  600.  
  601. static int getdtrn(dest)
  602. char **dest;
  603. {
  604.     dom_trans **tmpm;
  605.     char *p;
  606.  
  607.     if (verbose & (1<<15)) fprintf(stderr,"getdtrn: %s(%d): %s %s\n",
  608.         configname,linecnt,k,v);
  609.  
  610.     for (p=v;*p && !isspace(*p);p++);
  611.     if (*p) *p++='\0';
  612.     while (*p && isspace(*p)) p++;
  613.     if (*p == '\0')
  614.     {
  615.         fprintf(stderr,"%s(%d): less than two tokens in domtrans",
  616.             configname,linecnt);
  617.     }
  618.     else
  619.     {
  620.         for (tmpm=(dom_trans**)dest;*tmpm;tmpm=&((*tmpm)->next));
  621.         (*tmpm)=(dom_trans *)
  622.             xmalloc(sizeof(dom_trans));
  623.         (*tmpm)->next=NULL;
  624.         (*tmpm)->ftndom=xstrcpy(v);
  625.         (*tmpm)->intdom=xstrcpy(p);
  626.         if (verbose & (1<<15)) fprintf(stderr,"getdtrn: %s(%d): expr \"%s\" line \"%s\"\n",
  627.             configname,linecnt,v,p);
  628.     }
  629.  
  630.     return 0;
  631. }
  632.  
  633. static int getlong(dest)
  634. char **dest;
  635. {
  636.     if (verbose & (1<<15)) fprintf(stderr,"getlong: %s(%d): %s %s\n",
  637.         configname,linecnt,k,v);
  638.     if (strspn(v,"0123456789") != strlen(v)) 
  639.         fprintf(stderr,"%s(%d): %s %s - bad numeric\n",
  640.             configname,linecnt,k,v);
  641.     else *((long*)dest)=atol(v);
  642.     return 0;
  643. }
  644.  
  645. static int ctoi(char*);
  646. static int ctoi(s)
  647. char *s;
  648. {
  649.     int i;
  650.  
  651.     if (!strncmp(s,"0x",2)) sscanf(s+2,"%x",&i);
  652.     else if (*s == '0') sscanf(s,"%o",&i);
  653.     else if (strspn(s,"0123456789") == strlen(s)) sscanf(s,"%d",&i);
  654.     else i=0;
  655.     return i;
  656. }
  657.  
  658. static int getctab(dest)
  659. char **dest;
  660. {
  661.     FILE *fp;
  662.     char buf[BUFSIZ],*p,*q;
  663.     int in,on;
  664.  
  665.     if (verbose & (1<<15)) fprintf(stderr,"getctab: %s(%d): %s %s\n",
  666.         configname,linecnt,k,v);
  667.     if ((fp=fopen(v,"r")) == NULL)
  668.     {
  669.         fprintf(stderr,"%s(%d): cannot open mapchan file \"%s\"",
  670.             configname,linecnt,v);
  671.         perror("");
  672.         return 0;
  673.     }
  674.  
  675.     while (fgets(buf,sizeof(buf)-1,fp))
  676.     {
  677.         p=strtok(buf," \t\n#");
  678.         q=strtok(NULL," \t\n#");
  679.         if (p && q)
  680.         {
  681.             in=ctoi(p);
  682.             on=ctoi(q);
  683.             if (in && on) ((char*)dest)[in]=on;
  684.         }
  685.     }
  686.     fclose(fp);
  687.  
  688.     return 0;
  689. }
  690.  
  691. static int getverbose(dest)
  692. char **dest;
  693. {
  694.     if (verbose & (1<<15)) fprintf(stderr,"getverbose: %s(%d): %s %s\n",
  695.         configname,linecnt,k,v);
  696.     if (verbset)
  697.     {
  698.         if (verbose & (1<<15))
  699.             fprintf(stderr,"getverbose: already set, ignore\n");
  700.         return 0;
  701.     }
  702.     *((unsigned long*)dest)=setverbose(v);
  703.     if (verbose & (1<<15)) fprintf(stderr,"getverbose: %lu\n",
  704.         *((unsigned long*)dest));
  705.     return 0;
  706. }
  707.  
  708. #ifdef TESTING
  709.  
  710. int main(argc,argv)
  711. int argc;
  712. char *argv[];
  713. {
  714.     verbose = 1<<15;
  715.  
  716.     if (argv[1]) configname=argv[1];
  717.     return readconfig();
  718. }
  719.  
  720. #endif
  721.